home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
oh!.2hd
/
OH!DEN_B.LZH
/
TOOLS
/
DC_VIEW
/
DCFILE.C
< prev
next >
Wrap
Text File
|
1995-03-20
|
9KB
|
357 lines
/******************************************************************************
* DCfile.c: ファイル読み込み処理
******************************************************************************
*
*
*/
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stat.h>
#include <io.h>
#include <jfctype.h>
#include <doslib.h>
#include <event.h> /* イベントマンを利用するときに必要 */
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <window.h> /* ウィンドウマンを利用するときに必要 */
#include <control.h> /* コントロールマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "DC.h" /* このプログラム固有のヘッダファイル */
/******************************************************************************
* GetData(): データ読み込み
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* char *pname ファイル名(フルパス)
*/
int GetData(ComVal *pcv, char *pname)
{
FILE *fn;
int i,cutOk;
long fileLen, line;
char *data;
void **dmy1;
fn = fopen(pname, "rb");
if (fn == NULL) {
pcv->errorCode = -2;
DMError(D_CONFIRM,"ファイルが見つかりません");
return(0);
}
fseek(fn, -1, SEEK_END);
fileLen = ftell(fn); /* ファイルサイズを求める */
fseek(fn, 0, SEEK_SET);
dmy1 = NULL;
dmy1 = MMChHdlNew((fileLen*3)/2 + 64);
if (dmy1 == NULL) { /* メモリが確保できる? */
DMError(D_CONFIRM | D_RED, "メモリが確保できません");
fclose(fn);
return(0);
}
MMHdlDispose(dmy1);
EMEnCross(); /* マウスポインタアニメーション開始 */
if (pcv->loadFlag) {
GMDisposeRgn(pcv->updateRgnHdl);
MMHdlDispose(pcv->txt);
MMHdlDispose(pcv->txtNo);
}
pcv->updateRgnHdl = GMNewRgn();
pcv->txt = MMChHdlNew(fileLen); /* テキストメモリ確保 */
line = fileLen / 2;
pcv->txtNo = MMChHdlNew(line + 64); /* 行ポインタ確保 */
MMHdlLock(pcv->txt);
fread(*(pcv->txt), sizeof(char), (size_t) (fileLen), fn);
MMHdlUnlock(pcv->txt);
fclose(fn);
dispoBits(pcv);
pcv->loadFlag = 1;
pcv->file_size = fileLen;
pcv->status = 0;
strcpy(pcv->currentFname, pname);
chkdrv(pcv); /* ドライブパスのチェック */
setWinOpt(pcv); /* ウィンドウオプション設定 */
cutOk = processText(pcv); /* テキストの整理 */
CMMaxSet(pcv->volHdl, pcv->Maxline - 29);
EMDeCross(); /* マウスポインタをもとに戻す */
if (!cutOk && pcv->cutDisp)
DMError(D_CONFIRM,
"一部あるいは全部の\rCUTファイルの読み込みに失敗しました");
return(1);
}
/******************************************************************************
* processText(): テキストの整理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
int processText(ComVal *pcv)
{
int i,ii,jj,j,k,tb,vw,line_end,pat1,pat2,esc,cut_lno,cutOk;
int word_count,line_count,txt_end;
char cutfname[90];
char dmyfname[90];
char buff[90];
char *txtPt,*txtTop,*txtBuf;
int *txtNo;
Rect rc = { 0, 0, 588, 382};
char drv[90], path[90], node[90], ext[90];
MMHdlLock(pcv->txt); /* テキストブロックのハンドルをロック */
MMHdlLock(pcv->txtNo);
txtPt = *(pcv->txt);
txtNo = *(pcv->txtNo);
txtTop = txtPt;
line_count = 0;
*txtNo = 0;
if (pcv->cutDisp) {
cutOk = 1;
} else {
cutOk = 0;
}
while(1) {
j = 0;
jj = 0;
vw = 0;
*(txtNo + line_count) = txtPt - txtTop;
txt_end = 0;
while(1) {
if (*txtPt == 26) { /* EOF */
*txtPt = 0;
txt_end = 1;
break;
}
if (*txtPt == 9) { /* TAB処理 */
tb = 8 - (jj % 8);
j = 0;
jj = jj + tb;
txtPt++;
continue;
}
if (*txtPt == 13) { /* 改行処理 */
txtPt++;
break;
}
if (*txtPt == 10) { /* LF処理 */
*(txtNo + line_count) = *(txtNo + line_count) + 1;
txtPt++;
continue;
}
if (jj == 94){ /* 行の折り返し */
pat1 =((int)*txtPt << 8) + (int)*(txtPt+1);
if (jiszen(pat1) && (*(txtPt + 2) == 13)) {
txtPt = txtPt + 3;
break;
}
pat2 =((int)*(txtPt-1) << 8) + (int)*txtPt;
if (jiszen(pat2) && (!jiszen(pat1))) {
txtPt++;
if (*txtPt == 13) txtPt++;
break;
}
}
if (*txtPt == '%') { /* %コード処理 */
if (*(txtPt + 1) == 'V') { /* 倍角設定 */
vw = 1;
txtPt = txtPt + 4;
j = 0;
continue;
}
if ((*(txtPt + 1) == 'C' && cutOk && pcv->cutNo < 30)) {
if (*(txtPt + 4) == ':') { /* カットファイル*/
txtBuf = txtPt;
cut_lno = '0';
*(txtPt+2) = '0'+(char)pcv->cutNo;
*(txtPt+3) = cut_lno;
txtPt = txtPt + 5;
while(!(isalnmkana((int)*txtPt)) && *txtPt != '\\') {
txtPt++;
}
for(i=0;i<90;i++) {
if (*txtPt == '.')
break;
dmyfname[i] = *txtPt++;
}
for(ii=i;ii<i+4;ii++) {
dmyfname[ii] = *txtPt++;
}
dmyfname[ii] = 0;
if (*dmyfname == '\\') {
if (!strncmp(pcv->currentFname,pcv->a_drv, strlen(pcv->a_drv)))
sprintf(buff, "A:%s", dmyfname);
else
sprintf(buff, "B:%s", dmyfname);
structfname(pcv, "", buff, cutfname);
} else {
strsfn(pcv->currentFname, drv, path, node, ext);
sprintf(cutfname, "%s%s\\%s", drv, path,dmyfname);
}
if (!cut(pcv, cutfname)) {
cutOk = 0;
txtPt = txtBuf;
*(txtPt+2) = 'U';
*(txtPt+3) = 'T';
} else {
continue;
cutOk = 1;
}
} else if (cutOk) {
*(txtPt+2) = '0' + (char)pcv->cutNo - 1;
*(txtPt+3) = ++cut_lno;
}
}
}
if (*txtPt == 24) { /* 倍角解除 */
if (vw == 1) {
vw = 0;
j = 0;
continue;
}
txtPt++;
continue;
}
if (*txtPt == 27) { /* esc文字属性 */
if (*(txtPt+1) == '[') {
esc = 0;
txtPt = txtPt + 2;
while(*txtPt != 'm') {
txtPt++;
}
txtPt++;
continue;
}
}
if (jj>=94) {
break;
}
txtPt++;
jj++;
}
if (txt_end) break;
if ((txtPt - txtTop + 1) >= pcv->file_size) break;
line_count++;
}
pcv->Maxline = line_count;
pcv->ofset = 0;
MMHdlUnlock(pcv->txtNo); /* テキストブロックのハンドルをアンロック */
MMHdlUnlock(pcv->txt);
return(cutOk);
}
/******************************************************************************
* setWinOpt(): ウィンドウ設定
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void setWinOpt(ComVal *pcv)
{
LASCII wTitle;
char name[90],node[90],ext[5];
Task mytask;
size_t len;
char *txtPt,*ttPt,*tePt;
strcpy(name, pcv->currentFname);
stcgfn(node, name);
if (strcmp(node, "MOKUJI") == 0) {
MMHdlLock(pcv->txt);
txtPt = *(pcv->txt);
ttPt = strstr(txtPt, "電脳倶楽部 ");
MMHdlUnlock(pcv->txt);
tePt = strstr(ttPt, "(");
strncpy(pcv->title, ttPt, tePt - ttPt);
pcv->title[tePt - ttPt] = 0;
}
len = strlen(pcv->currentFname);
/* ファイル名の変更があったのでタスク管理レコードに設定
(タスク起動チェックに必要)*/
TSGetTdb(&mytask, TS_OWN);
mytask.command[0] = len;
strncpy((char *) &mytask.command[1], pcv->currentFname, len);
TSSetTdb(&mytask, TS_OWN);
stcgfn(name, pcv->currentFname);
stcgfe(ext, pcv->currentFname);
wTitle[0] = sprintf((char *) &wTitle[1], "%s [%s.%s]",pcv->title,name,ext);
WMTitleSet(pcv->windowPtr, wTitle);
}
/******************************************************************************
* chkdrv(): ドライブパス設定
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
*/
void chkdrv(ComVal *pcv)
{
char name[256], node[256], try_a[236], drv[90], path[90], ext[5];
int i, pat = 0;
strcpy(name, pcv->currentFname);
stcgfn(node, name);
if (strncmp(node, "MOKUJI", 6))
return;
pcv->mloadFlag = 0;
for(i=0;i<strlen(name);i++) { /* 仮想A:ドライブパス設定 */
if (!strncmp(strupr(&name[i]), "QS", 2) ||
!strncmp(strupr(&name[i]), "QUICKSTART", 2)) {
pat = 1;
break;
}
}
if (!pat)
return;
strsfn(pcv->currentFname, drv, path, node, ext); /* カレントパス設定 */
sprintf(pcv->currentPath, "%s%s\\", drv, path);
strncpy(try_a, name, i - 1); /* 仮想B:ドライブパス設定 */
try_a[i-1] = 0;
strcpy(pcv->a_drv, try_a);
if (try_a[2] != '\\') {
try_a[0] = try_a[0] + 1;
strcpy(pcv->b_drv, try_a);
return;
}
if (try_a[i-2] == '1') {
try_a[i-2] = '2';
} else if ((try_a[i-2] == 'a') || (try_a[i-2] == 'A')) {
try_a[i-2] = 'B';
} else {
return;
}
strcpy(pcv->b_drv, try_a);
}STR@ "ロ EdEV 3.00 <